package com.xb.myspring.util;

import cn.hutool.core.collection.ListUtil;

import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;

/**
 * 功能：利用并行流快速处理数据
 */
public class BatchConsumer {

    /**
     * 并行数量
     */
    private final static int SIZE = 2;

    /**
     * 调整并发数目
     */
    static {
        System.setProperty("java.util.concurrent.ForkJoinPool.common.parallelism", "4");
    }

    /**
     * 并行方法
     * @param list     数据集合
     * @param consumer 消费型方法，直接使用 mapper::method 方法引用的方式
     * @param <T>      数据类型
     */
    public static <T> void parallel(List<T> list, Consumer<List<T>> consumer) {
        parallel(list, consumer, SIZE);
    }

    public static <T> void parallel(List<T> list, Consumer<List<T>> consumer, int size) {
        if (list == null || list.size() < 1) {
            return;
        }
        List<List<T>> streamList = new ArrayList<>();
        for (int i = 0; i < list.size(); i += size) {
            int j = Math.min((i + size), list.size());
            List<T> subList = list.subList(i, j);
            streamList.add(subList);
        }
        // 并行流使用的并发数是 CPU 核心数，不能局部更改。
        streamList.parallelStream().forEach(consumer);
    }


    public static void main(String[] args) {
        ArrayList<Integer> dataList = ListUtil.toList(1,2,3,4,5,6,7,8,9,10);
        BatchConsumer.parallel(dataList, System.out::println);
    }

}